package com.klun.likou;

public class Solution12 {
	// todo
	public static void main(String[] args) {
		String s = intToRoman(2994);
		System.out.println(s);
	}

	/**
	 * 罗马数字包含以下七种字符： I， V， X， L，C，D 和 M
	 *字符          数值
	 * I             1
	 * V             5
	 * X             10
	 * L             50
	 * C             100
	 * D             500
	 * M             1000
	 *
	 * 以下六种情况特殊的规则：
	 *
	 *     I 可以放在 V (5) 和 X (10) 的左边，来表示 4 和 9。
	 *     X 可以放在 L (50) 和 C (100) 的左边，来表示 40 和 90。
	 *     C 可以放在 D (500) 和 M (1000) 的左边，来表示 400 和 900
	 *
	 * @return
	 */
	public static String intToRoman(int num) {
		// 把阿拉伯数字与罗马数字可能出现的所有情况和对应关系，放在两个数组中
		// 并且按照阿拉伯数字的大小降序排列，这是贪心选择思想
		int[] nums = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
		String[] romans = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};

		StringBuilder stringBuilder = new StringBuilder();
		int index = 0;
		while (index < 13) {
			// 特别注意：这里是等号
			while (num >= nums[index]) {
				// 注意：这里是等于号，表示尽量使用大的"面值"
				stringBuilder.append(romans[index]);
				num -= nums[index];
			}
			index++;
		}
		return stringBuilder.toString();
	}
}
